package com.yiruantong.system.service.permission;

import com.yiruantong.system.domain.permission.SysUser;
import com.yiruantong.system.domain.permission.bo.SysUserBo;
import com.yiruantong.system.domain.permission.vo.SysUserVo;
import com.yiruantong.common.core.domain.R;
import com.yiruantong.common.core.domain.model.ModifyEmailBody;
import com.yiruantong.common.core.domain.model.ModifyPhoneNumberBody;
import com.yiruantong.common.mybatis.core.page.PageQuery;
import com.yiruantong.common.mybatis.core.page.TableDataInfo;
import com.yiruantong.common.mybatis.core.service.IServicePlus;

import java.util.List;
import java.util.Map;

/**
 * 用户 业务层
 *
 * @author YiRuanTong
 */
public interface ISysUserService extends IServicePlus<SysUser, SysUserVo, SysUserBo> {
  TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery);

  /**
   * 根据条件分页查询用户列表
   *
   * @param user 用户信息
   * @return 用户信息集合信息
   */
  List<SysUserVo> selectUserList(SysUserBo user);


  /**
   * 根据条件查询用户列表
   *
   * @param map 用户信息
   * @return 用户信息集合信息
   */
  List<Map<String, Object>> getUserList(Map<String, Object> map);

  /**
   * 根据条件分页查询已分配用户角色列表
   *
   * @param user 用户信息
   * @return 用户信息集合信息
   */
  TableDataInfo<SysUserVo> selectAllocatedList(SysUserBo user, PageQuery pageQuery);

  /**
   * 根据条件分页查询未分配用户角色列表
   *
   * @param user 用户信息
   * @return 用户信息集合信息
   */
  TableDataInfo<SysUserVo> selectUnallocatedList(SysUserBo user, PageQuery pageQuery);

  /**
   * 通过用户名查询用户
   *
   * @param userName 用户名
   * @return 用户对象信息
   */
  SysUserVo selectUserByUserName(String userName);

  /**
   * 通过手机号查询用户
   *
   * @param phoneNumber 手机号
   * @return 用户对象信息
   */
  SysUserVo selectUserByPhoneNumber(String phoneNumber);

  /**
   * 通过用户ID查询用户
   *
   * @param userId 用户ID
   * @return 用户对象信息
   */
  SysUserVo selectUserById(Long userId);

  /**
   * 根据用户ID查询用户所属角色组
   *
   * @param userName 用户名
   * @return 结果
   */
  String selectUserRoleGroup(String userName);

  /**
   * 根据用户ID查询用户所属岗位组
   *
   * @param userName 用户名
   * @return 结果
   */
  String selectUserPostGroup(String userName);

  /**
   * 校验用户名称是否唯一
   *
   * @param user 用户信息
   * @return 结果
   */
  boolean checkUserNameUnique(SysUserBo user);

  /**
   * 校验手机号码是否唯一
   *
   * @param user 用户信息
   * @return 结果
   */
  boolean checkPhoneUnique(SysUserBo user);

  /**
   * 校验email是否唯一
   *
   * @param user 用户信息
   * @return 结果
   */
  boolean checkEmailUnique(SysUserBo user);

  /**
   * 校验用户是否允许操作
   *
   * @param userId 用户ID
   */
  void checkUserAllowed(Long userId);

  /**
   * 校验用户是否有数据权限
   *
   * @param userId 用户id
   */
  void checkUserDataScope(Long userId);

  /**
   * 新增用户信息
   *
   * @param user 用户信息
   * @return 结果
   */
  int insertUser(SysUserBo user);

  /**
   * 注册用户信息
   *
   * @param user 用户信息
   * @return 结果
   */
  boolean registerUser(SysUserBo user, String tenantId);

  /**
   * 修改用户信息
   *
   * @param user 用户信息
   * @return 结果
   */
  int updateUser(SysUserBo user);

  /**
   * 用户授权角色
   *
   * @param userId  用户ID
   * @param roleIds 角色组
   */
  void insertUserAuth(Long userId, Long[] roleIds);

  /**
   * 修改用户状态
   *
   * @param userId 用户ID
   * @param enable 帐号状态
   * @return 结果
   */
  int updateUserStatus(Long userId, byte enable);

  /**
   * 修改用户基本信息
   *
   * @param user 用户信息
   * @return 结果
   */
  int updateUserProfile(SysUserBo user);

  /**
   * 修改用户头像
   *
   * @param userId 用户ID
   * @param avatar 头像地址
   * @return 结果
   */
  boolean updateUserAvatar(Long userId, Long avatar);

  /**
   * 重置用户密码
   *
   * @param userId           用户ID
   * @param passwordStrength 密码强度值
   * @param password         密码
   * @return 结果
   */
  int resetUserPwd(Long userId, double passwordStrength, String password);

  /**
   * 通过用户ID删除用户
   *
   * @param userId 用户ID
   * @return 结果
   */
  int deleteUserById(Long userId);

  /**
   * 批量删除用户信息
   *
   * @param userIds 需要删除的用户ID
   * @return 结果
   */
  int deleteUserByIds(Long[] userIds);

  /**
   * 通过部门id查询当前部门所有用户
   *
   * @param deptId
   * @return
   */
  List<SysUserVo> selectUserListByDept(Long deptId);

  /**
   * 修改手机号
   *
   * @param user
   * @return
   */
  R<Void> modifyPhoneNumber(ModifyPhoneNumberBody user);

  /**
   * 修改邮箱
   *
   * @param emailBody
   * @return
   */
  R<Void> modifyEmail(ModifyEmailBody emailBody);

  /**
   * 激活邮箱
   *
   * @param email 邮箱
   * @return boolean
   */
  boolean emailActivate(String email);

  /**
   * 激活手机号
   *
   * @param phoneNumber 手机号
   * @return boolean
   */
  boolean phoneActivate(String phoneNumber);

  /**
   * 注册用户
   */
  R<Void> register(SysUserBo userBo);

  /**
   * 生成html文件
   *
   * @param sysUser
   * @return
   */
  String generateHtmlContent(SysUser sysUser);

  /**
   * add
   *
   * @param bo
   * @return
   */
  R<Map<String, Object>> apiAdd(SysUserBo bo);

  SysUser getByName(String userName);
}
